<?php

/**
 * This is the model class for table "Alocacao".
 *
 * The followings are the available columns in table 'Alocacao':
 * @property string $ID_ALOCACAO
 * @property integer $ID_AMBIENTE
 * @property string $DT_DIA
 * @property integer $HR_INI
 * @property integer $HR_FIM
 * @property integer $ID_USO
 * @property integer $ID_USUARIO
 * @property string $TX_INTERESSADO
 * @property string $TX_DESCRICAO
 * @property string $ID_TEMPLATE
 */
class Alocacao extends CActiveRecord {

    /**
     * Returns the static model of the specified AR class.
     * @return Alocacao the static model class
     */
    public static function model($className=__CLASS__) {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'Alocacao';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('ID_AMBIENTE, DT_DIA, HR_INI, HR_FIM, ID_USO, ID_USUARIO, TX_INTERESSADO', 'required'),
            array('ID_AMBIENTE, HR_INI, HR_FIM, ID_USO, ID_USUARIO, ID_TEMPLATE', 'numerical', 'integerOnly' => true),
            array('TX_INTERESSADO', 'length', 'max' => 80),
            array('TX_DESCRICAO', 'length', 'max' => 255),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array(
                'ID_AMBIENTE,
                    DT_DIA,
                    HR_INI,
                    HR_FIM,
                    ID_USO,
                    ID_USUARIO,
                    TX_INTERESSADO, 
                    TX_DESCRICAO, 
                    nomePredio,
                    nomeAmbiente,
                    responsavel',
                'safe', 'on' => 'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'iD_USUARIO' => array(self::BELONGS_TO, 'Usuario', 'ID_USUARIO'),
            'iD_AMBIENTE' => array(self::BELONGS_TO, 'Ambiente', 'ID_AMBIENTE'),
            'iD_USO' => array(self::BELONGS_TO, 'Uso', 'ID_USO'),
            'iD_TEMPLATE' => array(self::BELONGS_TO, 'Template', 'ID_TEMPLATE'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'ID_ALOCACAO' => 'Código',
            'ID_AMBIENTE' => 'Ambiente',
            'DT_DIA' => 'Dia',
            'HR_INI' => 'Hora Início',
            'HR_FIM' => 'Hora Fim',
            'ID_USO' => 'Finalidade',
            'ID_USUARIO' => 'Usuário',
            'TX_INTERESSADO' => 'Interessado',
            'TX_DESCRICAO' => 'Descrição',
            'responsavel' => 'Responsável',
            'finalidade' => 'Finalidade',
            'nomePredio' => 'Prédio',
            'nomeAmbiente' => 'Ambiente',
            'ID_TEMPLATE' => 'Template'
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;

        $criteria->with = (array('iD_USUARIO', 'iD_AMBIENTE', 'iD_USO', 'iD_TEMPLATE'));

        $criteria->compare('ID_ALOCACAO', $this->ID_ALOCACAO, true);

        $criteria->compare('ID_AMBIENTE', $this->ID_AMBIENTE);

        $criteria->compare('iD_AMBIENTE.TX_NOME', $this->getNomeAmbiente());

        $criteria->compare('iD_USO.TX_DESCRICAO ', $this->getFinalidade());

        $criteria->compare('iD_USUARIO.TX_NOME ', $this->getResponsavel());

        $criteria->compare('DT_DIA', $this->DT_DIA, true);

        $criteria->compare('HR_INI', $this->HR_INI);

        $criteria->compare('HR_FIM', $this->HR_FIM);

        $criteria->compare('ID_USO', $this->ID_USO);

        $criteria->compare('ID_USUARIO', $this->ID_USUARIO);

        $criteria->compare('TX_INTERESSADO', $this->TX_INTERESSADO, true);

        $criteria->compare('TX_DESCRICAO', $this->TX_DESCRICAO, true);

        $idPredio = Predio::model()->findByAttributes(array('TX_DESCRICAO' => $this->nomePredio));
        if ($idPredio != null) {
            $criteria->compare('iD_AMBIENTE.ID_PREDIO', $idPredio->ID_PREDIO, true);
        } else if ($this->nomePredio != null) {
            $criteria->compare('iD_AMBIENTE.ID_PREDIO', -1, true);
        }

        $sort = new CSort();
        $sort->attributes = array(
            'defaultOrder' => 't.DT_DIA ASC',
            'ID_AMBIENTE' => array(
                'asc' => 't.ID_AMBIENTE',
                'desc' => 't.ID_AMBIENTE desc',
            ),
            'DT_DIA' => array(
                'asc' => 't.DT_DIA asc',
                'desc' => 't.DT_DIA desc',
            ),
            'HR_INI' => array(
                'asc' => 't.HR_INI',
                'desc' => 't.HR_INI desc',
            ),
            'HR_FIM' => array(
                'asc' => 't.HR_FIM',
                'desc' => 't.HR_FIM desc',
            ),
            'ID_USO' => array(
                'asc' => 't.ID_USO',
                'desc' => 't.ID_USO desc',
            ),
            'responsavel' => array(
                'asc' => 't.ID_USUARIO asc',
                'desc' => 't.ID_USUARIO desc',
            ),
            'TX_INTERESSADO' => array(
                'asc' => 't.TX_INTERESSADO',
                'desc' => 't.TX_INTERESSADO desc',
            ),
            'nomePredio' => array(
                'asc' => 'iD_AMBIENTE.TX_DESCRICAO asc',
                'desc' => 'iD_AMBIENTE.TX_DESCRICAO desc',
            ),
            'nomeAmbiente' => array(
                'asc' => 'iD_AMBIENTE.TX_NOME asc',
                'desc' => 'iD_AMBIENTE.TX_NOME desc',
            ),
            'finalidade' => array(
                'asc' => 'iD_USO.TX_DESCRICAO asc',
                'desc' => 'iD_USO.TX_DESCRICAO desc',
            ),
            'responsavel' => array(
                'asc' => 'iD_USUARIO.TX_NOME asc',
                'desc' => 'iD_USUARIO.TX_NOME desc',
            ),
        );

        return new CActiveDataProvider('Alocacao', array(
                    'criteria' => $criteria,
                    'sort' => $sort
                ));
    }

    public function advancedSearch() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
        $arrayRecursos = array();
        $alocacao = new Alocacao();
        if (isset($_GET['Alocacao'])) {
            $alocacao->attributes = $_GET['Alocacao'];
        }
        $criteria = new CDbCriteria;

        $criteria->with = array('iD_PREDIO');

        $criteria->group = 't.ID_AMBIENTE';

        $criteria->join = 'LEFT OUTER JOIN ambiente_recurso recursos_recursos ON (t.ID_AMBIENTE = recursos_recursos.ID_AMBIENTE) LEFT OUTER JOIN recurso recursos ON (recursos.ID_RECURSO = recursos_recursos.ID_RECURSO) LEFT OUTER JOIN ambiente_uso usos_usos ON (t.ID_AMBIENTE=usos_usos.ID_AMBIENTE) LEFT OUTER JOIN Uso usos ON (usos.ID_USO=usos_usos.ID_USO)';



        if (isset($_GET['Ambiente_Recurso']['ID_RECURSO'])) {
            $arrayRecursos = $_GET['Ambiente_Recurso']['ID_RECURSO'];
        }

        if (is_array($arrayRecursos)) {
            foreach ($arrayRecursos as $recurso) {
                $criteria->addCondition(
                        '(exists (select 1 from ambiente_recurso inner join ambiente 
                        on (ambiente_recurso.id_ambiente = ambiente.id_ambiente)
                        where ambiente_recurso.id_ambiente = t.id_ambiente and ambiente_recurso.id_recurso = ' . $recurso . '))', 'AND');
            }
        }

        $criteria->compare('usos_usos.ID_USO', $this->ID_USO);

        $criteria->order = ('iD_PREDIO.TX_DESCRICAO ASC, TX_NOME ASC');

        $_GET['Ambiente_Recurso'] = null;
        $_GET['Ambiente_Uso'] = null;
        $sort = new CSort();
        $sort->attributes = array(
            'defaultOrder' => 'iD_PREDIO.TX_DESCRICAO ASC, t.TX_NOME ASC',
            'ID_AMBIENTE' => array(
                'asc' => 't.ID_AMBIENTE',
                'desc' => 't.ID_AMBIENTE desc',
            ),
            'ID_PREDIO' => array(
                'asc' => 'iD_PREDIO.TX_DESCRICAO asc',
                'desc' => 'iD_PREDIO.TX_DESCRICAO desc',
            ),
            'TX_NOME' => array(
                'asc' => 't.TX_NOME',
                'desc' => 't.TX_NOME desc',
            ),
            'NU_CAPACIDADE' => array(
                'asc' => 't.NU_CAPACIDADE',
                'desc' => 't.NU_CAPACIDADE desc',
            ),
        );
        return new CActiveDataProvider('Ambiente', array(
                    'criteria' => $criteria,
                ));
    }

    public function beforeSave() {
        if ($this->DT_DIA == '') {
            $this->setAttribute('DT_DIA', null);
        } else {
            $dateArray = explode('/', $this->DT_DIA);
            $d = $dateArray[0];
            $m = $dateArray[1];
            $a = $dateArray[2];
            $this->DT_DIA = date('Y-m-d', mktime(null, null, null, $m, $d, $a));
        }
        return parent::beforeSave();
    }

    public function isEmpty($DT_DIA, $ID_AMBIENTE, $HR_INI, $HR_FIM) {
        $sql = 'select al.id_ambiente from alocacao al 
                where al.dt_dia = date("' . MethodUtils::getDateInTableFormat($DT_DIA) . '")
                and al.ID_AMBIENTE = ' . $ID_AMBIENTE . '
                and (
                    (' . $HR_INI . ' >= al.hr_ini and ' . $HR_INI . ' <= al.hr_fim)
                    or (' . $HR_FIM . ' >= al.hr_ini and ' . $HR_FIM . ' <= al.hr_FIM)
                    or (' . $HR_INI . ' <= al.hr_ini and ' . $HR_FIM . ' >= al.hr_fim)
                )';
        $existAlocacao = Alocacao::model()->findBySql($sql);
        if ($existAlocacao == null) {
            return false;
        }
        return true;
    }

    public function afterFind() {
        $retVal = parent::afterFind();
        $dateArray = explode('-', $this->DT_DIA);
        $a = $this->DT_DIA;
        if (count($dateArray) == 3) {
            $a = $dateArray[0];

            $m = $dateArray[1];

            $d = $dateArray[2];
            $this->DT_DIA = date('d/m/Y', mktime(null, null, null, $m, $d, $a));
        }
        return $retVal;
    }

    private $_nomePredio = null;

    public function getNomePredio() {
        if ($this->_nomePredio === null && $this->iD_AMBIENTE !== null) {
            $this->_nomePredio = $this->iD_AMBIENTE->iD_PREDIO->TX_DESCRICAO;
        }
        return $this->_nomePredio;
    }

    public function setNomePredio($value) {
        $this->_nomePredio = $value;
    }

    private $_nomeAmbiente = null;

    public function getNomeAmbiente() {
        if ($this->_nomeAmbiente === null && $this->iD_AMBIENTE !== null) {
            $this->_nomeAmbiente = $this->iD_AMBIENTE->TX_NOME;
        }
        return $this->_nomeAmbiente;
    }

    public function setNomeAmbiente($value) {
        $this->_nomeAmbiente = $value;
    }

    private $_finalidade = null;

    public function getFinalidade() {
        if ($this->_finalidade === null && $this->iD_USO !== null) {
            $this->_finalidade = $this->iD_USO->TX_DESCRICAO;
        }
        return $this->_finalidade;
    }

    public function setFinalidade($value) {
        $this->_finalidade = $value;
    }

    private $_responsavel = null;

    public function getResponsavel() {
        if ($this->_responsavel === null && $this->iD_USUARIO !== null) {
            $this->_responsavel = $this->iD_USUARIO->TX_NOME;
        }
        return $this->_responsavel;
    }

    public function setResponsavel($value) {
        $this->_responsavel = $value;
    }

    /**
     * Método utilizado na consulta de salas para obter alocações de um determinado período
     * @param type $i - [7,22] -> hora da alocação
     * @param type $j - [0,1] -> minuto da alocação 0=>00 e 1=>30
     * @return array com model Alocacao ou null se não existe
     */
    public function getAlocacao($i, $j, $date, $arr) {
        $hrIni = intval('' . $i . ($j == 0 ? '00' : '30'));
        $hrFim = intval('' . ($j % 2 == 0 ? $i : $i + 1) . ($j % 2 == 0 ? '30' : '00'));
        $dt = MethodUtils::normalizeDateFormat($date);
        if ($arr != null) {
            foreach ($arr as $model) {
                $dia = $model->DT_DIA;
                $ini = $model->HR_INI;
                $fim = $model->HR_FIM;
                if ($model->DT_DIA == $dt) {
                    if ($hrIni >= $model->HR_INI && $hrIni <= $model->HR_FIM && $hrFim >= $model->HR_INI && $hrFim <= $model->HR_FIM) {
                        $textCell = explode(' ', $model->TX_INTERESSADO);
                        $textCell = $textCell[0];
                        return CHtml::label(
                                        $textCell, '', array(
                                    'title' => '<strong>' . $model->TX_INTERESSADO . '</strong><br>' . $model->TX_DESCRICAO,
                                    'class' => 'tiptip'
                                        )
                        );
                    }
                }
            }
        }
        if (Yii::app()->user->getState("identity") != null) {
            return CHtml::checkbox('Alocacao_selected[]', false, array('id' => $dt . '.' . $hrIni . '.' . $hrFim, 'value' => $dt . '.' . $hrIni . '.' . $hrFim));
        } else {
            return '';
        }
    }

}